package top.fwpsl.script.base

import scala.collection.mutable.ArrayBuffer

/**
  * 定长数组和变长数组
  * @author 风戏fw
  * @date 2020/11/26
  */
object ArrayDemo {

  def main(args: Array[String]) {

    //初始化一个长度为8的定长数组，其所有元素均为0
    val arr1 = new Array[Int](8)
    //直接打印定长数组，
    println(arr1)
    //将数组转换成数组缓冲，就可以看到原数组中的内容了
    //toBuffer会将数组转换长数组缓冲
    println(arr1.toBuffer)
    //用for遍历一个数组，i是数组元素
    for(i <- arr1) println(i)
    //给数组中的元素赋值，arr1数组名称（）小括号里面加下标赋值
    arr1(0) = 1
    //取值arr1数组名称（）小括号里面加下标赋值
    println(arr1(0))

    //注意：如果没有new，相当于调用了数组的apply方法，直接为数组赋值
    //初始化一个长度为1的定长数组，小括号中为数组的元素
    val arr2 = Array[Int](10)
    val arr02 = Array[Int](7,3,4)
    println(arr2.toBuffer)

    //定义一个长度为3的定长数组
    val arr3 = Array("hadoop", "storm", "spark")
    //取值、赋值
    val str = arr3(1)
    arr3(1) = "storm"

    //使用()来访问元素
    println(arr3(2))

   println("-------------------")
    //变长数组（数组缓冲）
    //如果想使用数组缓冲，需要导入import scala.collection.mutable.ArrayBuffer包
    //小括号中为元素，不是数组长度,可以有多个值
    //小括号不能省略，里面可以不写元素
    val arr01= ArrayBuffer[Int](1,2,3,4)
    //小括号能省略，小括号中的只能有一个数字且没有意义
//    val arr02 = new ArrayBuffer[Int]()
//    val arr02 = new ArrayBuffer[Int]

    val ab = ArrayBuffer[Int]()
    //向数组缓冲的尾部追加一个元素
    //+=尾部追加元素
    ab += 1
    //追加多个元素
    ab += (2, 3, 4, 5)
    //追加一个数组++=
    ab ++= Array(6, 7)
    //追加一个数组缓冲 这个数据可以是定长数组也可以是边长数组
    ab ++= ArrayBuffer(8,9)
    //打印数组缓冲ab

    //在数组某个位置插入元素用insert(位置，元素) 插入一个元素或者多个元素
    ab.insert(0,  2)
    //在下标2之前插入6，7
    ab.insert(2, 6)

    //删除数组某个位置的元素用remove(位置) remove(位置，元素个数)
    ab.remove(8)
    ab.remove(8,2)
    println(ab)
    //删除数组某个元素，如果这个元素有多个，只删除第一个
    ab-=(3)
    //删除数组多个元素，如果这个元素有多个，只删除第一个，如果不存在则不删除
    ab-=(3, 4, 5)


    //定长数组与变长数组的转换
//    arr3 = arr1.toBuffer//arr1还是定长数组，返回一个边长数组, arr3是变长数组
    arr2.toArray
  }

}

